﻿using GN.Pay.Application.Dto.Input;
using GN.Pay.Application.GatewayApp.Dto.Input;
using GN.Pay.Application.GatewayApp.Dto.Output;
using GN.Pay.Core.Values.TradeRefund;
using GN.Pay.Core.Values.TradeTransfers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GN.Pay.Application.GatewayApp
{
    /// <summary>
    /// 交易申请应用服务
    /// </summary>
    public interface ITradeApplyAppService : IGatewayAppService
    {
        /// <summary>
        /// 收银台付款申请
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>       
        CashiePayApplyOutput CashiePayApply(CashiePayApplyInput input);

        /// <summary>
        /// 支付申请注册
        /// </summary>
        /// <param name="input">输入</param>
        /// <returns></returns>
        [GatewayService(GatewayServiceName.TradeApply.Trade_Apply_Pay_Register)]
        PayApplyOutput PayApplyRegister(PayApplyInput input);

        /// <summary>
        /// 支付通道注册
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [GatewayService(GatewayServiceName.TradeApply.Trade_Apply_Pay_Channel_Register)]
        PayChannelOutput PayChannelRegister(PayChannelInput input);

        /// <summary>
        /// 支付申请与通道注册
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [GatewayService(GatewayServiceName.TradeApply.Trade_Apply_Pay_ApplyChannel_Register)]
        PayChannelOutput PayApplyAndChannelRegister(PayApplyAndChannelInput input);

        /// <summary>
        /// 短信支付
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [GatewayService(GatewayServiceName.TradeApply.Trade_Apply_Pay_Channel_SmsPay)]
        PayChannelOutput SmsPay(SmsPayInput input);

        /// <summary>
        /// 退款申请
        /// </summary>
        /// <param name="input">输入</param>
        /// <returns></returns>
        [GatewayService(GatewayServiceName.TradeApply.Trade_Apply_Refund_Apply)]
        TradeRefundApplyResult RefundApply(RefundApplyInput input);

        /// <summary>
        /// 转账申请
        /// </summary>
        /// <param name="input">输入</param>
        /// <returns></returns>
        [GatewayService(GatewayServiceName.TradeApply.Trade_Apply_Transfers_Apply)]
        TradeTransfersApplyResult TransfersApply(TransfersApplyInput input);
        
    }
}
